import pika

"""
在数据爬取过程中，我们可能需要进行一些任务间通信机制的实现。比如说：

一个进程负责构造爬取请求，另一个进程负责执行爬取请求。
某个爬取任务进程完成了，通知另外一个进程进行数据处理。
某个进程新建了一个爬取任务，就通知另外一个进程开始数据爬取。
所以，为了降低这些进程的耦合度，就需要一个类似消息队列的中间件来存储和分发这些消息实现进程间的通信。

有了消息队列中间件之后，以上的两个任务就可以独立运行，通过消息队列来通信即可：

    一个进程将需要爬取的任务构造请求对象放入队列，另一个进程从队列中取出请求对象并执行爬取。

    某个爬取任务进程完成了，完成时就向消息队列发一个消息，另一个进程监听到这类消息，那就开始数据处理。

    某个进程新建了一个爬取任务，那就向消息队列发一个消息，另一个负责爬取的进程监听到这类消息，那就开始数据爬取。

    RabbitMQ 作为一个开源、可靠、灵活的消息队列中间件倍受青睐，本节我们就来了解下 RabbitMQ 的用法

    在本节开始之前，请确保已经正确安装好了 RabbitMQ，安装方式可以参考：https://setup.scrape.center/rabbitmq，确保其可以在本地正常运行。

    安装好之后用PowerShell 管理员启动，执行命令
    net start rabbitmq   启动 rabbitmq服务
    net stop rabbitmq   关闭 rabbitmq服务

    安装三方库
    pip install pika
"""


"""
 基本使用示例-start
 
 首先，RabbitMQ 提供的是队列的功能，我们要实现进程间通信，其本质上就是实现一个生产者 - 消费者模型，即一个进程作为生产者放入消息，另外一个进程作为消费者监听并处理消息，实现过程主要有 3 个关键点：

声明队列：通过指定队列的一些参数，将队列创建出来。
生产内容：生产者根据队列的连接信息连接队列，向队列中放入对应的内容。
消费内容：消费者根据队列的连接信息连接队列，从队列中取出对应的内容。
"""


"""
下面我们先来声明一个队列  队列名称: scrape
"""
# QUEUE_NAME = 'scrape'
# connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) # 创建连接
# channel = connection.channel() # 声明一个频道  利用它我们可以操作队列内容的生产和消费
# channel.queue_declare(queue=QUEUE_NAME)  # 通过频道创建一个队列: scrape


"""
  接着我们尝试向队列中添加一个内容
  这里我们调用了 channel 的 basic_publish 方法，向队列发布了一个内容，其中 routing_key 就是指队列的名称，body 就是真实的内容
"""
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) # 创建连接
QUEUE_NAME = 'scrape'
channel = connection.channel() # 声明一个频道  利用它我们可以操作队列内容的生产和消费
channel.basic_publish(exchange='',
                      routing_key=QUEUE_NAME,
                      body='Hello World!')

"""
现在前两步 —— 声明队列、生产内容其实已经完成了，接下来就是消费者从队列中获取内容了。 consumer.py中消费
"""
